package 尚硅谷多线程1;
/*
* 例子：创建三个窗口卖票，总票数为100张，使用实现Runnable接口的方式
* 使用同步代码块解决继承Thread类的方式的线程安全问题
* 在继承Thread类创建多线的方式中，慎用this充当同步监视器，考虑使用当前类充当同步监视器
* */
class Window3 extends Thread{
    private static int ticket=1000;//声明变量必须是static静态方法
    private static Object obj =new Object();//锁的声明也必须使用static静态方法
    @Override
    public void run() {

            while (true) {//注意：while(true)应该写在synchronized的外面 否则，就会变成单线程执行语句
                // synchronized (obj){正确
                //  synchronized (this){this代表这t1,t2,t3三个对象
                synchronized (Window2.class){//类也是对象 反射类 Window2.class只会加载一次
                try {
                  Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if (ticket > 0) {
                    System.out.println(getName() + "卖票 票＋" + ticket);
                    ticket--;
                } else break;
            }
        }
    }
}
public class ThreadTest {
    public static void main(String[] args) {
        Window3 t1=new Window3();
        Window3 t2=new Window3();
        Window3 t3=new Window3();
     t1.setName("线程一");t2.setName("线程二");t3.setName("线程三");
        t3.start();
     t1.start();t2.start();


    }

}
